home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / mmlc / m2.doc next >
Text File  |  1995-02-12  |  26KB  |  708 lines

  1.  
  2.  
  3.                  MML compiler for standard MIDI file (format 0)
  4.  
  5.                             M2 version 2.0
  6.           ==========================================================
  7.                                 取扱説明書
  8.  
  9.                                  Presented by YamaShiN 1994,1995
  10.  
  11.  
  12. 【 1.はじめに 】
  13.  
  14.     このプログラムは,テキストファイルに書かれたMMLから,スタンダードMI
  15.   DIファイル(以下SMFと表記します)を作成するMMLコンパイラです。
  16.     MMLとはMusicMacroLanguageの略で,演奏情報を文字で表
  17.   現するための一種の言語です。パソコンが8ビット主流の時代から,BASICな
  18.   どに標準で装備されていました。それらの一般的なMMLをベースに設計したので
  19.   一度でもMMLを使ったことがあれば,簡単にこのMMLコンパイラを使用できる
  20.   でしょう。
  21.     このプログラムはLSI-C86試食版でコンパイルされています。たぶんMS
  22.   -DOSV3.1以上のすべてのパソコン上で動くと思います。
  23.     このプログラムはフリーソフトウェアです。手数料以上のお金がかからないので
  24.   あれば,自由に使用,配付,転載してくださって結構です。こんなプログラムでも
  25.   多くの方に配布されることを望みます。ただし,このプログラムによって発生した
  26.   トラブルには,一切責任を負いません。
  27.  
  28.  
  29. 【 2.ファイル構成 】
  30.  
  31.     以下にこのMMLコンパイラのファイル構成を述べます。すべて揃っていること
  32.   を確認してください。また配付する際はなるべく以下の4ファイルをセットにして
  33.   ください。
  34.  
  35.   ファイル名      形式    内容
  36.   M2      .EXE    BIN     MMLコンパイラ本体
  37.   M2      .DOC    TXT     取扱説明書
  38.   SAMPLE  .M2     TXT     サンプル・ソース
  39.   SAMPLE  .MID    BIN     サンプル・SMF
  40.  
  41.  
  42. 【 3.起動方法 】
  43.  
  44.   コマンドラインから以下の書式で呼び出します。
  45.  
  46.   M2 <source file>
  47.  
  48.     例えば,「SAMPLE.M2」というソースをコンパイルする場合
  49.  
  50.   M2 sample.m2
  51.  
  52.   と入力します。エラーが出ず,「completed」というメッセージが表示さ
  53.   れると,コンパイルが成功したということです。
  54.   そうすると「SAMPLE.MID」というファイルがあるはずです。これはSM
  55.   Fフォーマット0が演奏できるプログラムで演奏することができます。しかし,エ
  56.   ラーが出て,コンパイルに失敗した場合の「SAMPLE.MID」は演奏できま
  57.   せん。演奏ソフトの中には,エラー終了時のSMFを演奏しようとすると,ハング
  58.   アップしてしまう物もあるかもしれません。
  59.  
  60.   出力ファイルの拡張子は強制的に「.MID」になります。
  61.   入力ファイルの拡張子を省略すると,強制的に「.M2」になります.もし,拡張
  62.   子のない「SAMPLE」というソースファイルをコンパイルしたい場合は,
  63.  
  64.   M2 sample.
  65.  
  66.   というように「.」を付けて入力してください。
  67.  
  68.   (注意)出力ファイルと同名ファイルがディスク上に存在しても,直接その上に上
  69.           書きしてしまいます。
  70.  
  71.  
  72. 【 4.MMLテキストの形式 】
  73.  
  74.     サンプルプログラムに目を通して,だいたいの感じをつかんでから以下を読んで
  75.   下さい。百聞は一見にしかず,です。
  76.     まず行についてですが,行は「コメント」「コンパイラ制御行」「コントロール
  77.   行」「MMLブロック行」の4つに分類することができます。
  78.     コンパイラ制御行は,行の先頭ならばファイル中どこに置いても構わないけれど
  79.   も,コントロール行はファイルの最初から”.begin”までで,その後にMMLブロ
  80.   ック行が置かれます。
  81.     コメントを表す書式は2つあります。詳しくは後章のプリプロセス・リファレン
  82.   ス参照して下さい。
  83.     行の先頭が”#”だとコンパイラ制御行として扱われます。詳しくは後章のプリ
  84.   プロセス・リファレンスを参照して下さい。
  85.     コントロール行は,プログラムの頭で様々な設定をするものです。プログラム先
  86.   頭から”.begin”までの行がコントロール行として扱われます。詳しくはコントロ
  87.   ールコマンド・リファレンスを参照して下さい。
  88.     ”.begin”以降がMMLブロック行として扱われます。MMLはブロックごとに
  89.   コンパイルしてはファイルに書き出して行くので,ブロックを大きくしない限りは
  90.   作成されるSMFのサイズには上限はありません。
  91.   1つのブロックは以下のように表現します。
  92.  
  93.         ブロック名
  94.         {
  95.               パート番号 [ 配列番号 ] = MML ;
  96.               パート番号 [ 配列番号 ] = MML ;
  97.                             |
  98.                             ↓
  99.               パート番号 [ 配列番号 ] = MML ;
  100.               パート番号 [ 配列番号 ] = MML ;
  101.         }
  102.  
  103.   パート番号は1から16まで,配列番号は0から15までがはいります。配列番号
  104.   は省略できます。それからMMLの後には必ず”; ”を忘れずに入れて下さい。
  105.   MMLブロック行は,コンパイラ制御行やコントロール行と違ってフリーフォーマ
  106.   ットで表現します。つまり物理的な行というものがないので行を気にすることなく
  107.   組めるというわけです。だから
  108.  
  109.     Test()
  110.     {
  111.         1[0]=cdcd
  112.              cd;
  113.         2[0]=efefef;
  114.     }
  115.  
  116.   は,
  117.  
  118.     Test(){1[0]=cdcdcd;2[0]=efefef;}
  119.  
  120.   と同じ事になります。
  121.   MMLの詳細は後章のMMLリファレンスを参照してください。
  122.  
  123.  
  124. 【 5.プリプロセス・リファレンス 】
  125.  
  126.     プリプロセスとは読み込んだテキストを整形することです。このMMLコンパイ
  127.   ラでは,テキストの整形とコンパイルを同時に行うので,あまり気にする必要はあ
  128.   りません。
  129.     ”#”が一番左端にあるときは,コンパイル制御行として扱われます。”#”と
  130.   そのあとの命令の間にはスペースをいれることもできます。つまり
  131. #define ABC
  132.   は
  133. #    define ABC
  134.   というようにしてもかまいません。
  135.  
  136.   ■1.コメント関係
  137.  
  138.     ▼コメント(C型)
  139.         /*   <文>   */
  140.     〈解説〉”/*”と”*/”で囲まれた文はコメントとみなされます。数行にわたる
  141.             コメントを書く場合に使用します。コメントのネストはできないように
  142.             しました。
  143.  
  144.     ▼コメント(C++型)
  145.         //   <文>
  146.     〈解説〉”//”以降の文は,行の終わりまでコメントとみなされます。
  147.  
  148.  
  149.   ■2.コンパイル制御行
  150.  
  151.     ▼マクロ定義
  152.         #define <マクロ名> <マクロ内容>
  153.     〈パラ〉・<マクロ名>31文字以内  ・<マクロ内容>255文字以内
  154.     〈解説〉マクロの定義をします。マクロ名には先頭に$マークをつけないで指
  155.             定してください。マクロ名にはアルファベットの大文字と小文字は区
  156.             別しています。マクロ内容は省略することもできます。
  157.     〈注意〉以下のようにマクロ内容に自分自身を定義しないでください。(無限
  158.             に展開し続けてしまう)
  159.             #define DATA abdcbcbd $DATA abc
  160.     〈 例 〉"$Drum1"があると"cdcd"と置き換えるようになります。
  161.             #define Drum1 cdcd
  162.  
  163.     ▼マクロ解除
  164.         #undef <マクロ名>
  165.     〈パラ〉・<マクロ名>31文字以内
  166.     〈解説〉マクロ名定義で登録されているマクロを解除(無効化)します。マク
  167.             ロ名には先頭に$マークをつけないで指定してください。
  168.     〈 例 〉#undef Drum1
  169.  
  170.     ▼外部ファイルの組み込み
  171.         #include <<ファイル名>>
  172.     〈パラ〉・<ファイル名>ファイル名 
  173.     〈解説〉ファイル名で指定した外部ファイルをこの位置に組み込みます。カレ
  174.             ントディレクトリ以外のファイルを指定する場合はフルパスで指定す
  175.             るなどして対処してください。
  176.     〈 例 〉#include <stdmidi.h>
  177.  
  178.     ▼条件コンパイル1
  179.         #ifdef <マクロ名>
  180.              ↓
  181.         #else
  182.              ↓
  183.         #endif
  184.     〈パラ〉・<マクロ名>31文字以内 
  185.     〈解説〉マクロ名で指定されているマクロが定義されている場合は#ifdefから
  186.              #elseまで,定義されていない場合は #elseから#endifまでをコンパ
  187.             イルの対象とします。 #elseは省略できます。ネスト可能。マクロ名
  188.             には$マークをつけないで指定してください。
  189.  
  190.     ▼条件コンパイル2
  191.         #ifndef <マクロ名>
  192.              ↓
  193.         #else
  194.              ↓
  195.         #endif
  196.     〈パラ〉・<マクロ名>31文字以内 
  197.     〈解説〉条件コンパイル1の否定形です。
  198.  
  199.     ▼ループ
  200.         #for <回数>
  201.              ↓
  202.         #next
  203.     〈パラ〉・<回数>1~32767省略不可
  204.     〈解説〉#for #next間を回数分ループします。ネスト可能。
  205.     〈 例 〉#for 2
  206.             Test{1=cccc;}
  207.             #next
  208.  
  209.     ▼メッセージ
  210.         #message <文>
  211.     〈パラ〉・<文>文字列
  212.     〈解説〉コンパイル中に,画面にメッセージを表示させます。
  213.  
  214.     ▼強制中断
  215.         #error <文>
  216.     〈パラ〉・<文>文字列
  217.     〈解説〉エラーを出してコンパイルを中断します。
  218.  
  219.   ■3.マクロ展開
  220.  
  221.     ▼マクロ展開
  222.         $<マクロ名>
  223.     〈パラ〉・<マクロ名>31文字以内
  224.     〈解説〉#defineで定義されたマクロを展開します。例えば
  225.             #define DRUM o2l4cdcdcdcd
  226.             .begin
  227.             Test(){
  228.                 0=$DRUM $DRUM $DRUM;
  229.             }
  230.             というソーステキストがあるとすると
  231.             .begin
  232.             Test(){
  233.                 0=o2l4cdcdcdcd o2l4cdcdcdcd o2l4cdcdcdcd;
  234.             }
  235.             というように展開されます。
  236.  
  237.     ▼リピート
  238.         $(<文字列>)<回数>
  239.     〈パラ〉・<文字列>文字列  ・<回数>2~16:省略値2
  240.     〈解説〉$( )で括られた文字列を回数分繰り返します。多行にわたる繰り返し
  241.             はできません。ネスト可能。
  242.     〈 例 〉$(cde)4         // これは,cdecdecdecde と展開されます。
  243.  
  244.  
  245. 【 6.コントロールコマンド・リファレンス 】
  246.  
  247.     ▼タイトル設定
  248.         .title  <タイトル名>
  249.     〈パラ〉・<タイトル名>255文字以内
  250.     〈解説〉曲のタイトルを設定します。
  251.     〈 例 〉.title sampleProgram
  252.  
  253.     ▼ 著作権表示
  254.         .copyright <著作権名>
  255.     〈パラ〉・<著作権名>255文字以内
  256.     〈解説〉曲の著作権表示((C)と発行年,著作権所有者名)をストアします。
  257.     〈 例 〉.copyright (c)1994,xxxxxxxx
  258.  
  259.     ▼分解能
  260.        .division <分解能値>
  261.     〈パラ〉・<分解能値>48~480
  262.     〈解説〉4分音符あたりの分解能を設定します。といっても内部的には分解能
  263.             48で処理してるので,分解能48以上の細かい表現は実際にはでき
  264.             ません。また,<分解能値>は48の倍数のとき正確なコンパイルがで
  265.             きます。(48の倍数以外だと微妙にくるってしまう。)この命令が
  266.             無い場合は,分解能48でコンパイルします。
  267.     〈 例 〉.division 480
  268.  
  269.     ▼拍子
  270.         .signature <分子> / <分母>
  271.     〈パラ〉・<分子>正の整数・<分母>正の整数
  272.     〈解説〉曲の拍子を設定します。
  273.     〈 例 〉.signature 4/4
  274.  
  275.     ▼初期テンポ
  276.         .tempo <テンポ値>
  277.     〈パラ〉・<テンポ値>30~600  省略不可
  278.     〈解説〉曲の始めのテンポを設定します。この命令が無い場合は,始めのテン
  279.             ポは120になります。
  280.     〈 例 〉.tempo 120
  281.  
  282.     ▼パート設定
  283.         .part <パート番号> <MIDIパート(チャンネル)>
  284.     〈パラ〉・<パート番号>1~16  ・<MIDIパート>1~16
  285.     〈解説〉パート番号とMIDIパートの対応を設定します。通常は,はじめか
  286.             ら,パート番号=MIDIパートとなっているので特に設定する必要
  287.             はありません。
  288.     〈 例 〉.part 1 12
  289.  
  290.     ▼リズム専用MMLを使用するパートを設定
  291.         .rhmPart <パート番号>
  292.     〈パラ〉・<パート>1~16省略不可
  293.     〈解説〉リズム専用MMLを使用するパートを設定します。詳しくは後章で。
  294.  
  295.     ▼リズム専用MMLコマンドの設定
  296.         .rhmNote <コマンド名> <ノート番号> <ベロシティ>
  297.     〈パラ〉・<コマンド名>A~Z(ただしRを除く)
  298.             ・<ノート番号>0~127  ・<ベロシティ>0~127
  299.     〈解説〉リズム専用MMLコマンドの設定をします。詳しくは後章で。
  300.     〈 例 〉.rhmnote B 36 127      // バスドラム
  301.             .rhmnote S 38 127      // スネアドラム
  302.  
  303.     ▼メモリー確保
  304.         .malloc <整数>
  305.     〈パラ〉・<整数>0`6000位まで  初期値:2048
  306.     〈解説〉ワークエリアのサイズをイベント単位で設定します。(Ver1では
  307.             バイト単位だった)ワークエリアは,1つのブロックをコンパイルす
  308.             る時に内部で使用するバッファのことです。ワークエリアは,自動的
  309.             に2048のイベントを確保しますので,ブロックを大きくしすぎて
  310.             ”Out  of  work-memory”というエラーがでた時以
  311.             外は特に設定する必要はありません。ただし,あまりたくさん確保す
  312.             るとマクロやエクスクルーシブ用のメモリー確保に失敗してしまいま
  313.             す。
  314.     〈 例 〉ワークエリアのサイズを3000にする。
  315.             .malloc 3000
  316.  
  317.     ▼メモ
  318.         .memo
  319.     〈解説〉メモ
  320.     〈 例 〉.memo  HELLO!
  321.  
  322.     ▼コントロール行の終わりに・・・
  323.         .begin
  324.     〈解説〉コントロール行の終わりに必ず必要。この命令以降にMML行が続き
  325.             ます。この命令以降は,コントロール命令はおけません。
  326.  
  327.  
  328. 【 7.MML・リファレンス 】
  329.  
  330.     ▼音程
  331.         {a~g}{+,#,-}<音長>,<ベロシティ>,<割合>
  332.     〈パラ〉・<音長>1~192  ・<ベロシティ>0~127  ・<割合>1~8
  333.     〈解説〉A~Gはそれぞれ A=ラ B=シ C=ド D=レ E=ミ F=ファ G=ソ の音程に対
  334.             応しています。A~Gの直後に #又は +を付けるとシャープ, -を付け
  335.             るとフラットになります。音長に” .”(ピリオド)をつけると音長
  336.             を1.5倍にします。音長やベロシティや割合が省略されるとL,V
  337.             ,Qコマンドで指定されている値になります。
  338.     〈 例 〉c+4
  339.             d2.,127
  340.  
  341.     ▼休符
  342.         r<音長>
  343.     〈パラ〉・<音長>1~192
  344.     〈解説〉休符です。音長に” .”(ピリオド)をつけると音長を1.5倍にし
  345.             ます。音長が省略されると,Lコマンドで指定されている値になりま
  346.             す。
  347.  
  348.     ▼タイ
  349.     〈解説〉タイは上の”音程”及び”休符”の<音長>のところで数字を”^”
  350.             でつなげて書きます。
  351.     〈 例 〉c+4^8
  352.             d2.^4,127
  353.  
  354.     ▼ノート番号指定
  355.         n<ノート番号>,<音長>,<ベロシティ>,<割合>
  356.     〈パラ〉・<ノート番号>0~127  ・その他は音程と同じ
  357.     〈解説〉音程をノート番号で指定します。
  358.  
  359.     ▼音長設定
  360.         l<音長>
  361.     〈パラ〉・<音長>1~64  初期値/省略値:4
  362.     〈解説〉休符や音程で音長を省略したときの音長を設定します。
  363.  
  364.     ▼音長の割合
  365.         q<割合>
  366.     〈パラ〉・<割合>1~8  初期値/省略値:8
  367.     〈解説〉1音中の音の長さの割合を設定します。
  368.     〈参考〉発音時間ΔT=(192/L)*(8/Q)*(DIV/48)
  369.  
  370.     ▼ベロシティ指定
  371.         v<ベロシティ>
  372.     〈パラ〉・<ベロシティ>0~15  初期値/省略値:15
  373.         @v<ベロシティ>
  374.     〈パラ〉・<ベロシティ>0~127  初期値/省略値:127
  375.     〈解説〉ベロシティを設定します。@vは0~127で指定しますがvは0~
  376.             15で指定するという以外に違いはありません。違いは表をみて下さ
  377.             い。
  378.       《vと@vの対応表》
  379.         V←→@V -------------------------------------------
  380.         0←→7      4←→39    8←→71  12←→103
  381.         1←→15    5←→47    9←→79  13←→111
  382.         2←→23    6←→55  10←→87  14←→119
  383.         3←→31    7←→63  11←→95  15←→127
  384.        -------------------------------------------------------
  385.  
  386.     ▼ベロシティ相対指定
  387.         ]<変化値>
  388.         [<変化値>
  389.     〈パラ〉・<変化値>整数  省略値:8
  390.     〈解説〉ベロシティ@Vのアップが”]”,ダウンが”[”。省略値が8なの
  391.             で,省略するとベロシティVのアップダウンと実質的には同じになり
  392.             ます。
  393.  
  394.     ▼オクターブ指定
  395.         o<オクターブ>
  396.     〈パラ〉・<オクターブ>0~8  初期値/省略値:4
  397.     〈解説〉オクターブを指定します。
  398.  
  399.     ▼オクターブ相対指定
  400.         >
  401.         <
  402.     〈解説〉”>”はオクターブを1つ上げて,”<”はオクターブを1つ下げま
  403.             す。
  404.  
  405.     ▼プログラムチェンジ
  406.         @<音色番号>
  407.     〈パラ〉・<音色番号>1~128
  408.     〈解説〉プログラムチェンジ。音色を変更します。
  409.  
  410.     ▼ピッチベンド
  411.         u<ベンド値>
  412.     〈パラ〉・<ベンド値>-8192~8191/省略値:0
  413.     〈解説〉音程を微妙に変化させます。
  414.  
  415.     ▼エクスクルーシブメッセージ
  416.         @x[<メッセージ>]
  417.     〈パラ〉・16進数(127バイト以下)
  418.     〈解説〉エクスクルーシブメッセージをストアします。文字列は,1バイトを
  419.             2文字の16進数で表現します。F0とF7で文字列をくくるのでF0とF7
  420.             は付けないでください。
  421.     〈 例 〉@x[4110421240007f0041]  /* GSreset */
  422.  
  423.     ▼テンポ設定
  424.         t<テンポ>
  425.     〈パラ〉・<テンポ>30~600  省略値:120
  426.     〈解説〉演奏のテンポを設定します。
  427.  
  428.     ▼テンポ相対指定
  429.         t{+,-}<変化値>
  430.     〈パラ〉・<変化値>整数  省略値:5
  431.     〈解説〉プラス記号,またはマイナス記号があるとテンポの相対指定となりま
  432.             す。テンポの値が30から600までにおさまるように指定してくだ
  433.             さい。
  434.     〈 例 〉t+8
  435.  
  436.     ▼拍子
  437.         @s<分子>/<分母>
  438.     〈パラ〉<分子>整数  <分母>1,2,4,8,16,32,64
  439.     〈解説〉曲の拍子を設定します。
  440.  
  441.     ▼歌詞
  442.         @w"<歌詞>"
  443.     〈パラ〉・<歌詞>文字列(255バイト以下)
  444.     〈解説〉歌詞をSMFの中に埋め込みます。
  445.     〈 例 〉@w"カラオケ・KARAOKE・からおけ"
  446.  
  447.     ▼メモ
  448.         @m"<メモ>"
  449.     〈パラ〉・<メモ>文字列(255バイト以下)
  450.     〈解説〉メモをSMFの中に埋め込みます。
  451.     〈 例 〉@m"メモメモメモメモメ"
  452.  
  453.     ▼コントロールチェンジ
  454.         @c<パラメータ1>/<パラメータ2>
  455.     〈パラ〉・<パラメータ1>0~127・<パラメータ2>0~127
  456.     〈解説〉コントロールチェンジです。コントロール番号<パラメータ1>に対応
  457.             する機能の値を<パラメータ2>に設定します。
  458.  
  459.     ▼パンポット
  460.         %c
  461.         %l<値>
  462.         %r<値>
  463.     〈パラ〉・<値>0~63:省略値63
  464.     〈解説〉%Cは中央,%Lは左より,%Rは右よりに音の定位を指定します。
  465.             %Cは,%L0,%R0と同じことです。また左右逆の音源が存在す
  466.             るので,そのときは%Lと%Rを反対ににて使用してください。
  467.  
  468.     ▼エクスプレッション
  469.         %e<値>
  470.     〈パラ〉・<値>0~127:省略値127
  471.     〈解説〉ボリュームと違って,既に鳴っている音を変化させます。
  472.  
  473.     ▼ボリューム
  474.         %v<値>
  475.     〈パラ〉・<値>0~127:省略値100
  476.     〈解説〉パートの音量を設定します。
  477.  
  478.     ▼モジュレーション
  479.         %m<値>
  480.     〈パラ〉・<値>0~127:省略値0
  481.     〈解説〉モジュレーションは音を震わせる効果があり,ビブラートの深さを0
  482.             ~127で指定します。
  483.  
  484.     ▼ホールド1(ダンパー)
  485.         %h<値>
  486.     〈パラ〉・<値>0,1:省略値0
  487.     〈解説〉ノートオフ後も音を伸ばす効果のあるダンパーペダルの操作を伝えま
  488.             す。0でoff,1でonです。
  489.  
  490.     ▼ソステヌート
  491.         %n<値>
  492.     〈パラ〉・<値>0,1:省略値0
  493.     〈解説〉発音中の音のみ伸ばす効果のあるソステヌートペダルの操作を伝えま
  494.             す。0でoff,1でonです。
  495.  
  496.     ▼ソフトペダル
  497.         %s<値>
  498.     〈パラ〉・<値>0,1:省略値0
  499.     〈解説〉音を弱くする効果のあるソフトペダルの操作を伝えます。0でoff
  500.             ,1でonです。
  501.  
  502.     ▼内部マクロ
  503.         _<内部マクロ名>
  504.     〈解説〉後章参照。
  505.  
  506.     ▼音を重ねる(和音)
  507.         ( MML | MML | …… | MML | MML )
  508.     〈解説〉音を重ねます。和音などを表現したりピッチベンドを使用するときな
  509.             どに役に立ちます。ネストが可能になりました。
  510.     〈 例 〉(c1|e1|g1)  // Cコード
  511.             (c1|u0r16u-400r16u-600r16u-800r16r2r4)  // ピッチを下げてゆく
  512.             (c1|_SLIDE(1,0,8191,64,64))
  513.  
  514.  
  515. 【 8.内部マクロ 】
  516.  
  517.     内部マクロは一応MMLと同じ扱いなので,普通のマクロとちがって,MMLの
  518.     中以外では使用できません。またパラメータは一切省略できません。
  519.  
  520.     ▼スライド
  521.         _SLIDE(<関数番号>,<開始値>,<終了値>,<ウエイト>,<回数>)
  522.     〈パラ〉<関数番号>1~2  <開始値><終了値>-8192~8191
  523.             <ウエイト>1~64  <回数>~64
  524.     〈解説〉ピッチベンドを<開始値>から<終了値>まで変化させます。<関数番号>
  525.             は何次関数(y=x^<関数番号>)で変化させるかです。<ウエイト>
  526.             とは1STEPベンドをずらす間のことで,これを<回数>繰り返しま
  527.             す。実際の変化時間は<ウエイト>÷<回数>です。ようするに<回数>=
  528.             <ウエイト>の場合は全音符ということになります。
  529.     〈 例 〉(c1|r2 _SLIDE(2,0,8191,64,32)) //  チョーキング
  530.  
  531.     ▼ウエーブ
  532.         _WAVE(<振幅>,<中央値>,<スピード>,<ウエイト>,<回数>)
  533.     〈パラ〉<振幅><中央値>-8192~8191  <スピード>0~180
  534.             <ウエイト>1~64  <回数>~64
  535.     〈解説〉ピッチベンドを<中央値>を中心にして<振幅>のサインカーブで変化さ
  536.             せます。<スピード>は1STEPで,単位円で何度回転させるかです
  537.             (0や180だと変化しません)。<ウエイト>と<回数>は上に同じで
  538.             す。ウエーブコマンドはサインの計算処理に時間がかかりすぎるので
  539.             あまり使用しないように!
  540.  
  541.     ▼LCDに文字を表示
  542.         _SCVLTR("<文字列>")
  543.     〈パラ〉・<文字列>32文字まで。ただし,アスキーコード32~127(た
  544.               だし’”’は使用できない)のキャラクター文字に限る。
  545.     〈解説〉サウンドキャンバスの通常はINSTRUMENTが表示されている
  546.             ところに文字を表示させます。
  547.     〈 例 〉_SCVLTR("GOOD MORNING!!")
  548.  
  549.     ▼LCDに絵を表示
  550.         _SCVDOT(<data 1>,<data 2>,・・・,<data31>,<data32>)
  551.     〈パラ〉・<data X>0~255
  552.     〈解説〉サウンドキャンバスの通常はレベルメーターとなっているLCDに,
  553.             16×16の絵を表示させます。<data 1>は左上8ドット,<data 2>
  554.             は右上8ドット,これがずーと続いて<data31>は左下8ドット, <da
  555.             ta32> は右下8ドットにあたります。データは2進数で表現するとわ
  556.             かりやすいでしょう。2進数表記については後章参照。
  557.     〈 例 〉LCDにまる(らしきもの)を表示します。
  558.             _SCVDOT(?(0b00000000),?(0b00000000),
  559.                     ?(0b00000011),?(0b11100000),
  560.                     ?(0b00000100),?(0b00010000),
  561.                     ?(0b00001000),?(0b00001000),
  562.                     ?(0b00010000),?(0b00000100),
  563.                     ?(0b00100000),?(0b00000100),
  564.                     ?(0b01000000),?(0b00000010),
  565.                     ?(0b01000000),?(0b00000010),
  566.                     ?(0b01000000),?(0b00000010),
  567.                     ?(0b01000000),?(0b00000010),
  568.                     ?(0b00100000),?(0b00000100),
  569.                     ?(0b00100000),?(0b00000100),
  570.                     ?(0b00010000),?(0b00001000),
  571.                     ?(0b00001100),?(0b00110000),
  572.                     ?(0b00000011),?(0b11000000),
  573.                     ?(0b00000000),?(0b00000000))
  574.  
  575.  
  576. 【 9.四則演算機能及び,2進/16進数表記 】
  577.  
  578.     数字を要求しているパラメータに”?”をつけ括弧で括った中にでは,四則演算
  579.   や2進/16進数表記をすることができます。ただし16ビットで処理しているの
  580.   でそれ以上の計算はできません。
  581.     2進数の場合は数字の先頭に”0b”を付け,16進数の場合は”0x”を付け
  582.   ます。
  583.   例:以下の場合は”V15”を指定したのと同じです。
  584.       V?(0x0F) V?(0b00001111) V?(13+2) V?((7*4+2)/2)
  585.  
  586. 【 10.リズム専用MML 】
  587.  
  588.   ■1.リズム専用MMLについて
  589.     
  590.     このリズム専用MMLは,MSX-MUSICのリズム音サブコマンドをベース
  591.   にしています。ただしこのMMLを使用すると,ベロシティに変化がつけられない
  592.   などいろいろな制限ができてしまうので,リズム専用MMLをしようしないで,従
  593.   来通り普通のMMLを使用してください。
  594.  
  595.   ■2.リズム専用MMLを使用することを宣言する
  596.  
  597.     コントロール行で
  598.  
  599.     .rhmPart <パート番号>
  600.  
  601.     と,リズム専用MMLを使用するパートを宣言します。複数のパート同時に使用
  602.     することはできません。この命令を宣言しないとリズム専用MMLは使用できま
  603.     せん。
  604.  
  605.     次に
  606.  
  607.     .rhmNote <コマンド名> <ノート番号> <ベロシティ>
  608.  
  609.     で<コマンド名>にノートを割り当てます。<コマンド名>はAからZまでの1文字
  610.     です。
  611.  
  612.   ■3.リズム専用MML
  613.  
  614.     MML内で
  615.  
  616.     <コマンド名><コマンド名>・・・<待ち時間(音長)>
  617.  
  618.     というように表現します。
  619.  
  620.     とりあえず以下のサンプルを見てください。
  621.  
  622.     // Rhythm sub command sample
  623.     .title Rhythm sample
  624.     .rhmPart 10
  625.     .rhmNote B 36 127    // bass drum
  626.     .rhmNote S 38 127    // acoustic snea
  627.     .rhmNote H 42 100    // closed hi-hat
  628.     .begin
  629.     {
  630.     10[0]=BSH8H8SH8H8;
  631.     }
  632.  
  633.     このMMLでは、バス/スネア/ハイハットを鳴らして8分音符待ち,ハイハッ
  634.     トを鳴らして8分音符待ち,スネア/ハイハットを鳴らして8分音符待ち,ハイ
  635.     ハットを鳴らして8分音符待ちます。
  636.  
  637.     @や%がつくMMLは使用できますが,その他(”R”を除く)のMMLコマン
  638.     ドは,リズム専用MMLパート内では使用できません。
  639.  
  640. 【 11.MML compiler [M] との違い 】
  641.  
  642.     1からプログラミングしなおしたので,かなり違う部分があります。まず一番の
  643.   違いは,プリプロセッサとコンパイラが一体化したことです。
  644.     次に追加部分をあげるときりがないので,仕様が変更されたところだけを羅列し
  645.   てみます。以下の部分を変更すればとりあえずコンパイルできます。
  646.     ・".compile"を".begin"に変更。ただし".compile"も使用できます。
  647.     ・パートが0~Fまでなのを1~16に変更。
  648.     ・配列を指定しなければならない。
  649.     ・N88-BASICにちなんで,タイコマンド"&"を”^”に変更。
  650.     ・スラー”^”を削除。
  651.  
  652. 【 12.実は・・・ 】
  653.  
  654.     締切り直前になって,2.0から2.1へバージョンアップしてしまいました。
  655.   追加したのは,MMLの"&”コマンドです。これは MML compiler [E}では使用で
  656.   きません。(時間がないのだ)
  657.  
  658.     このコマンドはタイとスラーを表現できます。使い方はF-BASIC386や
  659.   MSX-BASICやHE386のMMLの"&"コマンドとおなじです。
  660.  
  661.   タイの例  :c1&c1&c2 d4&d4
  662.   スラーの例:q6 cd&efga&b
  663.  
  664.     同じ音程を&で結んだときはタイになり,違う音程を結んだときはスラーになり
  665.   ます。
  666.  
  667.   上のタイの例は  c1^1^2 d4^4
  668.   上のスラーの例は q6 c q8 de q6 fg q8 ab
  669.   と同じです。
  670.  
  671.     このコマンドで,F-BASICなどの一般的なMMLに,かなり近づいたと思
  672.   います。
  673.  
  674. 【 13.さいごに 】
  675.  
  676.     このマニュアルで紹介されていない命令がたくさんあります(というより後から
  677.   削った。何故かというと,MMLcompiler[E]では使用できなかったり,自分でもよく
  678.   分からない,役に立たない,忘れている,などなど)。結構な数のコマンドが隠れ
  679.   ていると思うので,まあ発見できたら使用してください。こんなことだからプログ
  680.   ラムが肥大化するのですねぇ。
  681.  
  682.     突然ですが1995年1月までに作成した音楽プログラムをあげてみます。
  683.  
  684.   ソフトウェア名        動作機種    発表場所
  685.   --------------------------------------------------------------------------
  686.   MML compiler [M]      MS-DOS汎用  フリコレ9(修正版:フリコレ10)
  687.   MML compiler [M2]     MS-DOS汎用  フリコレ10
  688.   MML compiler [E]      MS-DOS汎用  フリコレ10
  689.   MML compiler [MX]     MSX2/2+/tR  未発表
  690.   SMF easy player       FM-TOWNS/2  フリコレ10
  691.   SMF format converter  MS-DOS汎用  フリコレ10
  692.   SMF diet              MS-DOS汎用  フリコレ10
  693.   SMF view              MS-DOS汎用  未発表
  694.   --------------------------------------------------------------------------
  695.  
  696.   こうしてみると, MML compiler [E] 以外はすべてSMF関係のプログラムです。
  697.   それにすべてコマンドから起動する…。しかし,役に立ちそうにないものばかりで
  698.   すね。
  699.  
  700.     しかし,いまさらMIDIでMMLという感じがします。というわけでこのMM
  701.   Lコンパイラはこれ以上バージョンアップはしないと思います。次回は…,今年は
  702.   大学受験の年なので,プログラミングは控えて…。その後は,High-C買って
  703.   GUIプログラミングに挑戦したいです。遠い先のはなしですが……。(以前GN
  704.   U  Cで挑戦したことがあったけれども,ライブラリーが全然ないので挫折した)
  705.  
  706.     ではまた会う日まで。
  707.                                                       1995年1月  記
  708.